//
// Stopwatch.h
//
// Library: Foundation
// Package: DateTime
// Module:  Stopwatch
//
// Definition of the Stopwatch class.
//
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Foundation_Stopwatch_INCLUDED
#define Foundation_Stopwatch_INCLUDED


#include "Poco/Clock.h"
#include "Poco/Foundation.h"


namespace Poco
{


class Foundation_API Stopwatch
/// A simple facility to measure time intervals
/// with microsecond resolution.
{
public:
    Stopwatch();
    ~Stopwatch();

    void start();
    /// Starts (or restarts) the stopwatch.

    void stop();
    /// Stops or pauses the stopwatch.

    void reset();
    /// Resets the stopwatch.

    void restart();
    /// Resets and starts the stopwatch.

    Clock::ClockDiff elapsed() const;
    /// Returns the elapsed time in microseconds
    /// since the stopwatch started.

    int elapsedSeconds() const;
    /// Returns the number of seconds elapsed
    /// since the stopwatch started.

    static Clock::ClockVal resolution();
    /// Returns the resolution of the stopwatch.

private:
    Stopwatch(const Stopwatch &);
    Stopwatch & operator=(const Stopwatch &);

    Clock _start;
    Clock::ClockDiff _elapsed;
    bool _running;
};


//
// inlines
//
inline void Stopwatch::start()
{
    if (!_running)
    {
        _start.update();
        _running = true;
    }
}


inline void Stopwatch::stop()
{
    if (_running)
    {
        Clock current;
        _elapsed += current - _start;
        _running = false;
    }
}


inline int Stopwatch::elapsedSeconds() const
{
    return int(elapsed() / resolution());
}


inline Clock::ClockVal Stopwatch::resolution()
{
    return Clock::resolution();
}


} // namespace Poco


#endif // Foundation_Stopwatch_INCLUDED
